﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using DevExpress.XtraCharts.Web;
using DevExpress.XtraCharts;
using System.Drawing;

public static class Graficador
{
	public static void DibujarGrafico(WebChartControl grafico, DataTable datos, string tipo_grafico, int cantidad_series, string formato_valor, string titulo, string titulo_eje_x, string titulo_eje_y, string titulo_serie_1, string titulo_serie_2)
	{
		//Seteo la paleta de colores y el titulo del grafico
		grafico.PaletteName = "Pastel Kit";
		ChartTitle titulo_grafico = new ChartTitle();
		titulo_grafico.Text = titulo;
		titulo_grafico.Font = new Font("Tahoma", 12, FontStyle.Bold);
		grafico.Titles.Add(titulo_grafico);
		
		//Distingo el tipo de grafico y ejecuto el metodo adecuado
		switch (tipo_grafico)
		{
			case "BAR":
				GraficarBarra(grafico, datos, cantidad_series, formato_valor, titulo, titulo_eje_x, titulo_eje_y, titulo_serie_1, titulo_serie_2);
				break;
			case "LIN":
				GraficarLinea(grafico, datos, cantidad_series, formato_valor, titulo, titulo_eje_x, titulo_eje_y, titulo_serie_1, titulo_serie_2);
				break;
			case "TOR":
				GraficarTorta(grafico, datos, formato_valor, titulo, titulo_serie_1);
				break;
		}
	}
	
	private static void GraficarTorta(WebChartControl grafico, DataTable datos, string formato_valor, string titulo, string titulo_serie_1)
	{
		//Creo la serie de torta
		Series serie = new Series(titulo_serie_1, ViewType.Pie);
		
		//Aplico el formato del valor
		AplicarFormatoASerie(serie, formato_valor);
		((PiePointOptions)serie.PointOptions).PercentOptions.ValueAsPercent = !((formato_valor == "moneda") || (formato_valor == "numero"));
		
		//Agrego los puntos necesarios a la serie		
		for (int i = 0; i < datos.Rows.Count; i++)
			serie.Points.Add(new SeriesPoint(datos.Rows[i].ItemArray[0].ToString(), new double[] { double.Parse(datos.Rows[i].ItemArray[1].ToString()) }));
		
		//Agrego la serie al grafico
		grafico.Series.Add(serie);
	}

	private static void GraficarBarra(WebChartControl grafico, DataTable datos, int cantidad_series, string formato_valor, string titulo, string titulo_eje_x, string titulo_eje_y, string titulo_serie_1, string titulo_serie_2)
	{
		//Creo las series de barras. La segunda la voy a utilizar solo de ser necesario
		Series serie1 = new Series(titulo_serie_1, ViewType.Bar);
		Series serie2 = new Series(titulo_serie_2, ViewType.Bar);
		
		//Seteo las opciones de formato
		AplicarFormatoASerie(serie1, formato_valor);
		if(cantidad_series == 2)
			AplicarFormatoASerie(serie2, formato_valor);
			
		//Agrego los puntos a las series
		for (int i = 0; i < datos.Rows.Count; i++)
		{
			serie1.Points.Add(new SeriesPoint(datos.Rows[i].ItemArray[0].ToString(), new double[] { double.Parse(datos.Rows[i].ItemArray[1].ToString()) }));
			if(cantidad_series == 2)
				serie2.Points.Add(new SeriesPoint(datos.Rows[i].ItemArray[0].ToString(), new double[] { double.Parse(datos.Rows[i].ItemArray[2].ToString()) }));
		}
		
		//Agrego las series
		grafico.Series.Add(serie1);
		if(cantidad_series == 2)
			grafico.Series.Add(serie2);
		
		//Seteo los titulos de los ejes
		AjustarTitulosEjes(grafico, titulo_eje_x, titulo_eje_y);
	}

	private static void GraficarLinea(WebChartControl grafico, DataTable datos, int cantidad_series, string formato_valor, string titulo, string titulo_eje_x, string titulo_eje_y, string titulo_serie_1, string titulo_serie_2)
	{
		//Creo las series de barras. La segunda la voy a utilizar solo de ser necesario
		Series serie1 = new Series(titulo_serie_1, ViewType.Line);
		Series serie2 = new Series(titulo_serie_2, ViewType.Line);

		//Seteo las opciones de formato
		AplicarFormatoASerie(serie1, formato_valor);
		if (cantidad_series == 2)
			AplicarFormatoASerie(serie2, formato_valor);

		//Agrego los puntos a las series
		for (int i = 0; i < datos.Rows.Count; i++)
		{
			serie1.Points.Add(new SeriesPoint(datos.Rows[i].ItemArray[0].ToString(), new double[] { double.Parse(datos.Rows[i].ItemArray[1].ToString()) }));
			if (cantidad_series == 2)
				serie2.Points.Add(new SeriesPoint(datos.Rows[i].ItemArray[0].ToString(), new double[] { double.Parse(datos.Rows[i].ItemArray[2].ToString()) }));
		}

		//Agrego las series
		grafico.Series.Add(serie1);
		if (cantidad_series == 2)
			grafico.Series.Add(serie2);

		//Seteo los titulos de los ejes
		AjustarTitulosEjes(grafico, titulo_eje_x, titulo_eje_y);

	}

	private static void AplicarFormatoASerie(Series serie, string formato_valor)
	{
		if (formato_valor == "moneda")
			serie.PointOptions.ValueNumericOptions.Format = NumericFormat.Currency;
		else
			if (formato_valor == "numero")
				serie.PointOptions.ValueNumericOptions.Format = NumericFormat.Number;
			else
				serie.PointOptions.ValueNumericOptions.Format = NumericFormat.Percent;
		
		serie.PointOptions.ValueNumericOptions.Precision = 1;
		serie.LegendPointOptions.PointView = PointView.Argument;
		serie.Label.ResolveOverlappingMode = ResolveOverlappingMode.Default;
	}
	
	private static void AjustarTitulosEjes(WebChartControl grafico, string titulo_eje_x, string titulo_eje_y)
	{
		XYDiagram diagram = (XYDiagram)grafico.Diagram;
		
		//Pongo las etiquetas en el ejeX inclinadas
		diagram.AxisX.Label.Angle = 45;
		
		//Seteo las opciones del eje X
		diagram.AxisX.Title.Visible = true;
		diagram.AxisX.Title.Alignment = StringAlignment.Center;
		diagram.AxisX.Title.Text = titulo_eje_x;
		diagram.AxisX.Title.Antialiasing = true;
		diagram.AxisX.Title.Font = new Font("Tahoma", 10, FontStyle.Bold);

		//Seteo las opciones del eje Y
		diagram.AxisY.Title.Visible = true;
		diagram.AxisY.Title.Alignment = StringAlignment.Center;
		diagram.AxisY.Title.Text = titulo_eje_y;
		diagram.AxisY.Title.Antialiasing = true;
		diagram.AxisY.Title.Font = new Font("Tahoma", 10, FontStyle.Bold);
	}
}
